#include<iostream>
#include<fstream>
#include<cstdio>
#include<string>
#include<vector>
#include<sstream>
#include<stdlib.h>
using namespace std;

void create_table(string filename);
void insert_data(string filename);
void drop_table(string filename);
void info_table(string filename);
void delete_from(string filename);
void select(string filename);

ofstream outfile;
ifstream infile;

int main(){
	string command,temp,filename;
	int pos,pos1;
	while(1){
		begin:
		getline(cin,command);//输入指令 
		pos=command.find(" ");
		pos1=command.rfind(" ");
		temp=command.substr(0,pos);
		filename=command.substr(pos1+1)+".txt"; 
		if(temp=="create"){//创建数据库
			outfile.open(filename.c_str());
			outfile.close();
			printf("Database created successfully\n");
		}else if(temp=="drop"){//删除数据库 
			remove(filename.c_str());
			printf("Database deleted successfully\n");
		}else if(temp=="use"){//选择数据库 
			printf("Database %s selected\n",command.substr(pos1+1).c_str());
			while(1){
				cin>>command;
				if(command=="create"){//创建数据表 
					create_table(filename);
					printf("Table created successfully\n");
				}else if(command=="insert"){//插入数据 
					insert_data(filename);
					printf("Data inserted successfully\n");
				}else if(command=="drop"){//删除数据表 
					drop_table(filename);
					printf("Table deleted successfully\n");
				}else if(command=="info"){//显示数据表 
					info_table(filename);
				}else if(command=="delete"){//删除数据 
					delete_from(filename);
					printf("Data deleted successfully\n");
				}else if(command=="select"){//选择数据显示 
					select(filename);
				}else if(command=="quit"){//退出此数据库 
					cin>>temp;
					cin>>temp;
					printf("Quit database %s successfully\n",temp.c_str());
					goto begin;
				}else if(command=="exit"){//退出程序 
					exit(0);
				}
			}
		}else if(temp=="exit"){//退出程序 
			exit(0);
		}
	}
	return 0;
}

void create_table(string filename){//创建数据表
	int pos,pos1,pos2;
	string temp,name,type,tablename;
	char c;
	outfile.open(filename.c_str(),ios::out|ios::app);
	cin>>temp;//table
	cin>>tablename;//数据表的名字 
	outfile<<"###"<<endl;//数据表分隔符 
	outfile<<tablename<<endl;
	cin>>c;//读取（ 
	while(1){
		cin>>temp;//输入类型 
		type=type+temp+" ";
		cin>>temp;//输入名字 
		if(temp[temp.size()-1]==';'){
			name=name+temp;
			name.erase(name.size()-2,2);
			type.erase(type.size()-1,1);
			break;
		}
		else
		{
			name=name+temp;
			name.replace(name.size()-1,1," ");
		}
	}

	outfile<<type<<endl;
	outfile<<name<<endl;
	outfile.close();
}

void insert_data(string filename){//插入数据 
	string line,temp,tablename,data;
	int line_number=0,i;
	vector<string> lines;
	char c;
	infile.open(filename.c_str());
	cin>>temp;//读取into
	cin>>tablename;//数据表名 
	cin>>temp;//读取set
	while(getline(infile,line)){
		lines.push_back(line);
	}
	infile.close();
	for(i=0;i<lines.size();i++){
		if(lines[i]==tablename){
			while(1){
				c=getchar();
				if(c=='=')
				{//等号后为数据 
					cin>>temp;//读取数据 
				}else{
					continue;
				}
				if(temp[temp.size()-1]==';')
				{//删除最后一个数据末尾分号 
					if(temp[0]=='\''){//删除字符串的单引号 
						temp=temp.substr(1,temp.size()-3);
					}else{
						temp=temp.substr(0,temp.size()-1);
					}
					data=data+temp;
					break;
				}else{
					if(temp[0]=='\''){//删除字符串单引号 
						temp=temp.substr(1,temp.size()-3);
					}else{
						temp=temp.substr(0,temp.size()-1);
					}
					data=data+temp+" ";
				}
			}
			lines.insert(lines.begin()+i+3,data);
		}
	}
	outfile.open(filename.c_str(),ios::out);
	for(i=0;i<lines.size();i++){
		outfile<<lines[i]<<endl;
	}
	outfile.close();
}

void drop_table(string filename){//删除数据表 
	string temp,tablename,line;
	vector<string> lines;
	int i,j;
	cin>>temp;//读取table
	cin>>tablename;
	infile.open(filename.c_str());
	while(getline(infile,line)){
		lines.push_back(line);
	}
	infile.close();
	for(i=0;i<lines.size();i++){//删除两个数据表分隔符之间的每一行数据
		if(lines[i]==tablename){
			lines[i-1].erase();
			for(j=i;j<lines.size();j++){
				if(lines[j]=="###"){
					break;
				}else{
					lines[j].erase();	
				}
			}
		}
	}
	outfile.open(filename.c_str(),ios::out);
	for(i=0;i<lines.size();i++){
		outfile<<lines[i]<<endl;
	}
	outfile.close();
}

void info_table(string filename){//显示数据表 
	string temp,tablename,line;
	vector<string> lines;
	int i,j,k;
	cin>>temp;//读取table
	cin>>tablename;//数据表名 
	infile.open(filename.c_str());
	while(getline(infile,line)){
		lines.push_back(line);
	}
	infile.close();
	for(i=0;i<lines.size();i++){//打印两个数据表分隔符之间的每一行数据 
		if(lines[i]==tablename){
			for(j=i;j<lines.size();j++){
				if(lines[j]=="###"){
					break;
				}
			}
			for(k=i+2;k<j;k++){
				cout<<lines[k]<<endl;
			}
		}
	}
}

void delete_from(string filename){//删除数据 
	string temp,tablename,name,data,line,temp1;
	vector<string> lines;
	int i,j,k;
	int pos;//数据位置 
	int cnt=1,cnt1=0;//数据名在第几个 
	int flag=0;//标记data是字符串还是整数或浮点数 
	double num,standard;
	cin>>temp;//读取from
	cin>>tablename;
	cin>>temp;//读取where
	cin>>temp;
	for(i=0;i<temp.size();i++){
		if(temp[i]=='='||temp[i]=='<'||temp[i]=='>'||temp[i]=='!'){
			name=temp.substr(0,i);//数据名 
			if(temp[i+1]=='='){
				data=temp.substr(i+2,temp.size());//数据为整数或浮点数 删除； 
				data.erase(data.size()-1,1);
				break;
			}else{
				if(temp[i+1]=='\''){
					data=temp.substr(i+2,temp.size());//数据为字符串 删除‘； 
					data.erase(data.size()-2,2);
					flag=1;
				}else{
					data=temp.substr(i+1,temp.size());//数据为整数或浮点数 删除； 
					data.erase(data.size()-1,1);
				}
				break;
			}
		}
	}
	infile.open(filename.c_str());
	while(getline(infile,line)){
		lines.push_back(line);
	}
	infile.close();
	if(flag==1){//删除字符串
		for(i=0;i<lines.size();i++){
			if(pos=lines[i].find(data)!=-1){
				lines.erase(lines.begin()+i);
			}
		}
	}else{//删除整数或浮点数 
		standard=atof(data.c_str());//将字符串data转为浮点数 
		for(i=0;i<lines.size();i++){
			if(lines[i]==tablename){
				pos=lines[i+2].find(name);
				temp1=lines[i+2].substr(0,pos+1);//数据名那一行 
				for(j=0;j<temp1.size();j++){
					if(temp1[j]==' '){
						cnt++;//目标数据列数 
					}
				}
				break;
			}
		}
		//i为数据表头的行数 
		for(k=0;k<temp.size();k++){//寻找满足条件的数据行 
			if(temp[k]=='='){
				for(j=i+3;lines[j]!="###"&&j<lines.size();j++){
					if(pos=lines[j].find(data)!=-1){
						lines.erase(lines.begin()+j);
					}
				}
				break;
			}else if(temp[k]=='>'){
				for(j=i+3;lines[j]!="###"&&j<lines.size();j++){
					istringstream iss(lines[j]);
					while(iss>>temp1){//依次把iss中的各个数据存入到字段temp1中
						cnt1++;
						if(cnt1==cnt){
							break;
						}//找到数据名的位置
					}cnt1=0;
					num=atof(temp1.c_str());
					if(temp[k+1]=='='){
						if(num>=standard){
							lines.erase(lines.begin()+j);
						}
					}else{
						if(num>standard){
							lines.erase(lines.begin()+j);
						}
					}
				}
				break;
			}else if(temp[k]=='<'){
				for(j=i+3;lines[j]!="###"&&j<lines.size();j++){
					istringstream iss(lines[j]);
					while(iss>>temp1){
						cnt1++;
						if(cnt1==cnt){
							break;
						}
					}cnt1=0;
					num=atoi(temp1.c_str());
					if(temp[k+1]=='='){
						if(num<=standard){
							lines.erase(lines.begin()+j);
						}
					}else{
						if(num<standard){
							lines.erase(lines.begin()+j);
						}
					}
				}
				break;
			}else if(temp[k]=='!'){
				for(j=i+3;lines[j]!="###"&&j<lines.size();j++){
					if(pos=lines[j].find(data)==-1){
						lines.erase(lines.begin()+j);
					}
				}
				break;
			}
		}
	}
	outfile.open(filename.c_str(),ios::out);
	for(i=0;i<lines.size();i++){
		outfile<<lines[i]<<endl;
	}
	outfile.close();
}

void select(string filename){//选择数据显示 
	string temp,temp1,tablename,condition,order,line,name,data,pattern;
	vector<string> dataname;//存放数据名 
	vector<string> lines;
	vector<int> col;//数据名列数 
	typedef struct{
		double result_d;
		vector<string> result_s;
	}result;
	result r[1000]={0},t;
	int flag=0;//是否要进行排序 
	int pos,cnt=1,cnt1=0;
	double num,standard;
	int i,j,k,l,m=-1;
	while(cin>>temp){//读入数据名 
		if(temp=="from"){
			break;
		}else{//删除数据后的逗号 
			if(temp[temp.size()-1]==','){
				temp=temp.substr(0,temp.size()-1);
				dataname.push_back(temp);
			}else{
				dataname.push_back(temp);
			}
		}
	}
	cin>>tablename;//读入数据表名 
	cin>>temp;//读取where
	cin>>condition;//读取condition
	if(condition[condition.size()-1]!=';'){
		cin>>temp;//读取order
		cin>>temp;//读取by
		cin>>temp;//读取math
		cin>>pattern;//排序方式 asc或desc 
		flag=1;//要进行排序 
	}
	infile.open(filename.c_str());
	while(getline(infile,line)){
		lines.push_back(line);
	}
	infile.close();
	for(i=0;i<condition.size();i++){
			if(condition[i]=='='||condition[i]=='<'||condition[i]=='>'||condition[i]=='!'&&flag==0){
				name=condition.substr(0,i);//数据名 
				if(condition[i+1]=='='){
					data=condition.substr(i+2,condition.size());
					if(flag==0){//数据为整数或浮点数 删除分号 
						data.erase(data.size()-1,1);
					}
					break;
				}else{
					if(condition[i+1]=='\''){
						data=condition.substr(i+2,condition.size()); 
						if(flag==0){//数据为字符串 删除单引号与分号 
							data.erase(data.size()-2,2);
						}else{
							data.erase(data.size()-1,1);
						}
					}else{
						data=condition.substr(i+1,condition.size()); 
						if(flag==0){//数据为整数或浮点数 删除分号 
							data.erase(data.size()-1,1);
						}
					}
					break;
				}
			}
		}
	standard=atoi(data.c_str());//将字符串data转为浮点数 
	for(i=0;i<lines.size();i++){
		if(lines[i]==tablename){
			pos=lines[i+2].find(name);
			temp1=lines[i+2].substr(0,pos+1);//数据名内一行 
			for(j=0;j<temp1.size();j++){
				if(temp1[j]==' '){
					cnt++;//目标数据列数 
				}
			}
			break;
		}
	}
	//i为数据表头的行数
	for(j=0;j<dataname.size();j++){//将要显示的数据列数存入容器 
		istringstream iss(lines[i+2]);
		while(iss>>temp){
			cnt1++;
			if(dataname[j]==temp){
				col.push_back(cnt1);
				break;
			}
		}
		cnt1=0;
	}
	cnt1=0;
	if(flag==0){//不用进行排序 
		for(k=0;k<condition.size();k++){//寻找满足条件的数据行 
			if(condition[k]=='='){
				for(j=i+3;j<lines.size();j++){
					if(lines[j]=="###"){
						break;
					}
					if(pos=lines[j].find(data)!=-1){
						for(l=0;l<col.size();l++){
							istringstream iss(lines[j]);
							while(iss>>temp){
								cnt1++;
								if(cnt1==col[l]){
									cout<<temp<<" ";
								}
							}cout<<endl;
							cnt1=0;
						}
					}
				}
				break;
			}else if(condition[k]=='>'){
				for(j=i+3;j<lines.size();j++){
					if(lines[j]=="###"){
						break;
					}
					istringstream iss(lines[j]);
					while(iss>>temp){
						cnt1++;
						if(cnt1==cnt){
							break;
						}
					}cnt1=0;
					num=atoi(temp.c_str());
					if(condition[k+1]=='='){
						if(num>=standard){
							for(l=0;l<col.size();l++){
								istringstream iss(lines[j]);
								while(iss>>temp){
									cnt1++;
									if(cnt1==col[l]){
										cout<<temp<<" ";
									}
								}
								cnt1=0;
							}cout<<endl;
						}
					}else{
						if(num>standard){
							for(l=0;l<col.size();l++){
								istringstream iss(lines[j]);
								while(iss>>temp){
									cnt1++;
									if(cnt1==col[l]){
										cout<<temp<<" ";
									}
								}
								cnt1=0;
							}cout<<endl;
						}
					}
				}
				break;
			}else if(condition[k]=='<'){
				for(j=i+3;j<lines.size();j++){
					if(lines[j]=="###"){
						break;
					}
					istringstream iss(lines[j]);
					while(iss>>temp){
						cnt1++;
						if(cnt1==cnt){
							break;
						}
					}cnt1=0;
					num=atoi(temp.c_str());
					if(condition[k+1]=='='){
						if(num<=standard){
							for(l=0;l<col.size();l++){
								istringstream iss(lines[j]);
								while(iss>>temp){
									cnt1++;
									if(cnt1==col[l]){
										cout<<temp<<" ";
									}
								}
								cnt1=0;
							}cout<<endl;
						}
					}else{
						if(num<standard){
							for(l=0;l<col.size();l++){
								istringstream iss(lines[j]);
								while(iss>>temp){
									cnt1++;
									if(cnt1==col[l]){
										cout<<temp<<" ";
									}
								}
								cnt1=0;
							}cout<<endl;
						}
					}
				}
				break;
			}else if(condition[k]=='!'){
				for(j=i+3;j<lines.size();j++){
					if(lines[j]=="###"){
						break;
					}
					if(pos=lines[j].find(data)==-1){
						for(l=0;l<col.size();l++){
							istringstream iss(lines[j]);
							while(iss>>temp){
								cnt1++;
								if(cnt1==col[l]){
									cout<<temp<<" ";
								}
							}
							cnt1=0;
						}cout<<endl;
					}
				}
				break;
			}
		}
	}else{//需要进行排序 
		for(k=0;k<condition.size();k++){//寻找满足条件的数据行 
			if(condition[k]=='='){
				for(j=i+3;j<lines.size();j++){
					if(lines[j]=="###"){
						break;
					}
					if(pos=lines[j].find(data)!=-1){
						for(l=0;l<col.size();l++){
							istringstream iss(lines[j]);
							while(iss>>temp){
								cnt1++;
								if(cnt1==col[l]){
									cout<<temp<<" ";
								}
							}cout<<endl;
							cnt1=0;
						}
					}
				}
				break;
			}else if(condition[k]=='>'){
				for(j=i+3;j<lines.size();j++){
					if(lines[j]=="###"){
						break;
					}
					istringstream iss(lines[j]);
					while(iss>>temp){
						cnt1++;
						if(cnt1==cnt){
							break;
						}
					}cnt1=0;
					num=atoi(temp.c_str());
					if(condition[k+1]=='='){
						if(num>=standard){
							r[m].result_d=num;
							for(l=0;l<col.size();l++){
								istringstream iss(lines[j]);
								while(iss>>temp){
									cnt1++;
									if(cnt1==col[l]){
										r[m].result_s.push_back(temp);
									}
								}
								cnt1=0;
							}
						}
					}else{
						if(num>standard){
							r[m].result_d=num;
							for(l=0;l<col.size();l++){
								istringstream iss(lines[j]);
								while(iss>>temp){
									cnt1++;
									if(cnt1==col[l]){
										r[m].result_s.push_back(temp);
									}
								}
								cnt1=0;
							}
						}
					}
					m++;
				}
				break;
			}else if(condition[k]=='<'){
				for(j=i+3;j<lines.size();j++){
					if(lines[j]=="###"){
						break;
					}
					istringstream iss(lines[j]);
					while(iss>>temp){
						cnt1++;
						if(cnt1==cnt){
							break;
						}
					}cnt1=0;
					num=atoi(temp.c_str());
					if(condition[k+1]=='='){
						if(num<=standard){
							r[m].result_d=num;
							for(l=0;l<col.size();l++){
								istringstream iss(lines[j]);
								while(iss>>temp){
									cnt1++;
									if(cnt1==col[l]){
										r[m].result_s.push_back(temp);
									}
								}
								cnt1=0;
							}
						}
					}else{
						if(num<standard){
							m++;
							r[m].result_d=num;
							for(l=0;l<col.size();l++){
								istringstream iss(lines[j]);
								while(iss>>temp){
									cnt1++;
									if(cnt1==col[l]){
										r[m].result_s.push_back(temp);
									}
								}
								cnt1=0;
							}
						}
					}
				}
				break;
			}else if(condition[k]=='!'){
				for(j=i+3;j<lines.size();j++){
					if(lines[j]=="###"){
						break;
					}
					if(pos=lines[j].find(data)==-1){
						for(l=0;l<col.size();l++){
							istringstream iss(lines[j]);
							while(iss>>temp){
								cnt1++;
								if(cnt1==col[l]){
									cout<<temp<<" ";
								}
							}
							cnt1=0;
						}
					}
				}
				break;
			}
		}
		if(pattern=="asc;"){//升序排序 
			for(k=0;k<=m;k++){
				for(l=0;l<m;l++){
					if(r[l].result_d>r[l+1].result_d){
						t=r[l];
						r[l]=r[l+1];
						r[l+1]=t;
					}
				}
			}
		}else{//降序排序 
			for(k=0;k<=m;k++){
				for(l=0;l<m;l++){
					if(r[l].result_d<r[l+1].result_d){
						t=r[l];
						r[l]=r[l+1];
						r[l+1]=t;
					}
				}
			}
		}
		for(k=0;k<=m;k++){
			for(l=0;l<r[k].result_s.size();l++){
				cout<<r[k].result_s[l]<<" ";
			}cout<<endl;
		}
	}
}